home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1994 December / PSL Monthly Shareware CD-ROM (Public Software Library)(December 1994).bin / prgmming / dos / c2 / double.c < prev    next >
C/C++ Source or Header  |  1991-11-15  |  2KB  |  79 lines

  1. #include <mem.h>
  2.  
  3. typedef unsigned real[3];
  4.  
  5. struct d_b {  /*structure of a double (bits parsed for transferring
  6.                  data from a pascal real */
  7.       unsigned int mant7 : 13; /*least signif. part of the mantissa*/
  8.       unsigned int mant6 : 3;
  9.       unsigned int mant5 : 13;
  10.       unsigned int mant4 : 3;
  11.       unsigned int mant3 :13;
  12.       unsigned int mant2 : 3;
  13.       unsigned int mant1 : 4; /*most signif. part of the mantissa*/
  14.       unsigned int exp : 11;
  15.       unsigned int sign : 1;
  16.             };
  17.  
  18. struct r_i {  /*structure of a real (bits parsed for transferring
  19.                  data to a double */
  20.       unsigned int exp : 8;
  21.       unsigned int mant6 : 3;
  22.       unsigned int mant5 :13;
  23.       unsigned int mant4 : 3;
  24.       unsigned int mant3 :13;
  25.       unsigned int mant2 : 3;
  26.       unsigned int mant1 : 4; /*most significant part of mantissa*/
  27.       unsigned int sign : 1;
  28.            };
  29.  
  30. union r_i_o {                 /*pascal real number input to inp*/
  31.              real inp;       /*parsed bits transferred out as xfr */
  32.              struct r_i xfr;
  33.              };
  34.  
  35. union d_i_o {                /*bits transferred in to inp*/
  36.        struct d_b  inp;      /*double read out as outp*/
  37.        double  outp;
  38.       };
  39.  
  40. double real_double(real real_no)
  41. {
  42.   union r_i_o r;
  43.   union d_i_o d;
  44.   int i;
  45.   for (i=0;i<3;i++) r.inp[i]=real_no[i];/*move real_no into transfer */
  46.                                         /*    structure */
  47.   d.inp.exp  = r.xfr.exp  + 894;        /*transfer data from pascal    */
  48.   d.inp.sign = r.xfr.sign ;             /*    structure to double      */
  49.   d.inp.mant1= r.xfr.mant1;             /*    structure                */
  50.   d.inp.mant2= r.xfr.mant2;
  51.   d.inp.mant3= r.xfr.mant3;
  52.   d.inp.mant4= r.xfr.mant4;
  53.   d.inp.mant5= r.xfr.mant5;
  54.   d.inp.mant6= r.xfr.mant6;
  55.   d.inp.mant7= 0;
  56.   return d.outp;                        /*return result from double*/
  57.                                         /*structure*/
  58. }
  59.  
  60.  
  61. void double_real(real *real_no,double doub_no)
  62. {
  63.   union r_i_o r;
  64.   union d_i_o d;
  65.   int i;
  66.  
  67.   d.outp=doub_no;
  68.   r.xfr.exp   = d.inp.exp-894;
  69.   r.xfr.sign  = d.inp.sign;
  70.   r.xfr.mant1 = d.inp.mant1;
  71.   r.xfr.mant2 = d.inp.mant2;
  72.   r.xfr.mant3 = d.inp.mant3;
  73.   r.xfr.mant4 = d.inp.mant4;
  74.   r.xfr.mant5 = d.inp.mant5;
  75.   r.xfr.mant6 = d.inp.mant6;
  76.  
  77.   memcpy(*real_no,r.inp,sizeof(real));
  78. }
  79.